<?php

/**
 *   OPENSHOP  管理员信息以及权限管理程序
 * 
 *   @link        http://baison.com.cn
 *   @copyright   Baison, Inc.
 *   @package     OpenShop
 *   @version     $Id: privilege.php,v 1.0 2009/06/12 07:35:58 modified $
 *   @author      FillBag <fillbag@hotmail.com>
 */

define('IN_OS', true);

require(dirname(__FILE__) . '/includes/init.php');

/* act操作项的初始化 */
if (empty($_REQUEST['act']))
{
    $_REQUEST['act'] = 'login';
}
else
{
    $_REQUEST['act'] = trim($_REQUEST['act']);
}

/* 初始化 $exc 对象 */
$exc = new exchange($os->table("admin_user"), $db, 'user_id', 'user_name');

/*------------------------------------------------------ */
//-- 退出登录
/*------------------------------------------------------ */
if ($_REQUEST['act'] == 'logout')
{
	//清空COOKIE、SESSION
    destroy_all();
    
    $_REQUEST['act'] = 'login';
}

/*------------------------------------------------------ */
//-- 登陆界面
/*------------------------------------------------------ */
if ($_REQUEST['act'] == 'login')
{
    header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
    header("Cache-Control: no-cache, must-revalidate");
    header("Pragma: no-cache");

    if ((intval($_CFG['captcha']) & CAPTCHA_ADMIN) && gd_version() > 0)
    {
        $smarty->assign('gd_version', gd_version());
        $smarty->assign('random',     mt_rand());
    }
    $smarty->display('login.tpl');
}

/*------------------------------------------------------ */
//-- 验证登陆信息
/*------------------------------------------------------ */
elseif ($_REQUEST['act'] == 'signin')
{

    if (!empty($_SESSION['captcha_word']) && (intval($_CFG['captcha']) & CAPTCHA_ADMIN))
    {
        include_once(ROOT_PATH . 'includes/cls_captcha.php');

        /* 检查验证码是否正确 */
        $validator = new captcha();
        if (!empty($_POST['captcha']) && !$validator->check_word($_POST['captcha']))
        {
			$links[0]['text'] = '返回上一页';
		    $links[0]['href'] = 'javascript:history.go(-1)';
		    $links[0]['flag'] = 'login_failed';
		    sys_msg('您输入的验证码不正确。', 1, $links);
        }
    }

    $_POST['username'] = isset($_POST['username']) ? trim($_POST['username']) : '';
    $_POST['password'] = isset($_POST['password']) ? trim($_POST['password']) : '';

    /* 检查管理员账户是否有效 */
    if(!is_account_valid($_POST['username'], md5($_POST['password'])))
    {
    	destroy_all();
    	sys_msg('您输入的是非法帐号，请联系管理员。');
    }
    
    /* 检查密码是否正确 */
    $sql = "SELECT user_id, user_name, password, last_login, action_list, last_login".
            " FROM " . $os->table('admin_user') .
            " WHERE user_name = '" . $_POST['username']. "' AND password = '" . md5($_POST['password']) . "'";
    $row = $db->getRow($sql);

    if ($row)
    {
    	//登陆的管理员人数是否达到最大限制
    	if(reach_max_signin())
    	{
    		make_json_alert('登陆的管理员账户，已经达到最大(' . MAX_ADMINISTRATOR . '人)限制，请联系开发商!', 'signout');
    	}
    	
    	if($row['action_list'] == 'all'){
			$action_list = $row['action_list'];
			$role_str = '超级管理员';
    	}else{
		    $privilege_arr = $db->getAll("SELECT r_f.action_id FROM " . $os->table('acl_role_user') . " r_u LEFT JOIN" . $os->table('acl_role_func') . 
		                        " r_f ON r_u.role_id=r_f.role_id WHERE r_u.user_id=".intval($row['user_id']));	      
		    if($privilege_arr){
			    $act_list = array();
				while (list($key, $val) = each($privilege_arr)) {
				    array_push($act_list, $val['action_id']);
				}
		        $action_list = trim(((sizeof($act_list)>0)  ?  join(',', $act_list)  :  0), ',');
		    }else{
		    	$action_list = '0';
		    }
		    
		    $arr_roles = $db->getAll("SELECT r.role_name FROM " . $os->table('acl_role_user') . " r_u LEFT JOIN" . $os->table('acl_role') . 
		                        " r ON r_u.role_id=r.role_id WHERE r_u.user_id=".intval($row['user_id']));	
		    if($arr_roles){
			    $roles_list = array();
				while (list($key, $val) = each($arr_roles)) {
				    array_push($roles_list, $val['role_name']);
				}
		        $role_str = trim(((sizeof($roles_list)>0)  ?  join(',', $roles_list)  :  '无角色'), ',');
		    }else{
		    	$role_str = '无角色';
		    }		    
    	}
    	
    	// 登录成功
        set_admin_session($row['user_id'], $row['user_name'], $action_list, $role_str, $row['last_login']);
        setcookie('OSCP[signin]',   1,   (gmtime() + 3600 * 24 * 365));

        if($row['action_list'] == 'all' && empty($row['last_login']))
        {
            $_SESSION['shop_guide'] = true;
        }

        // 更新最后登录时间和IP
        $db->query("UPDATE " .$os->table('admin_user').
                 " SET last_login='" . gmtime() . "', last_ip='" . real_ip() . "'".
                 " WHERE user_id='$_SESSION[admin_id]'");

        if (isset($_POST['remember']))
        {
            $time = gmtime() + 3600 * 24 * 365;
            setcookie('OSCP[admin_id]',   $row['user_id'],                            $time);
            setcookie('OSCP[admin_pass]', md5($row['password'] . $_CFG['hash_code']), $time);
        }

        // 清除购物车中过期的数据
        clear_cart();
		
        //echo "<form action='./index.php' name='admin_index'></form>";
        //echo "<script>window.document.admin_index.submit();</script>";
//        $links[0]['text'] = '进入管理中心';
//        $links[0]['href'] = './index.php';
//        sys_msg('登陆成功！', 0, $links);
        header("Location: ./index.php\n");

        exit;
    }
    else
    {
    	$links[0]['text'] = '返回上一页';
        $links[0]['href'] = 'javascript:history.go(-1)';
        $links[0]['flag'] = 'login_failed';
        sys_msg('您输入的帐号信息不正确。', 1, $links);
    }
}

/*------------------------------------------------------ */
//-- 管理员列表页面
/*------------------------------------------------------ */
elseif ($_REQUEST['act'] == 'list')
{
	//检查权限
	admin_priv();
	
    /* 模板赋值 */
    $smarty->assign('ur_here',     '管理员列表');
    $smarty->assign('action_link', array('href'=>'privilege.php?act=add', 'text' => '添加管理员'));
    $smarty->assign('full_page',   1);
    $smarty->assign('admin_list',  get_admin_userlist());

    /* 显示页面 */
    assign_query_info();
    
    $smarty->display("privilege_list.tpl");    
}

/*------------------------------------------------------ */
//-- 查询
/*------------------------------------------------------ */
elseif ($_REQUEST['act'] == 'query')
{
    $smarty->assign('admin_list',  get_admin_userlist());

    make_json_result($smarty->fetch('privilege_list.tpl'));
}

/*------------------------------------------------------ */
//-- 添加管理员页面
/*------------------------------------------------------ */
elseif ($_REQUEST['act'] == 'add')
{
    /* 检查权限 */
    admin_priv('add_admin');

    /* 判断允许添加的最大管理员数是否一致 */
    if(!check_max_admin())
    {
    	sys_msg('允许添加的最大管理员数，已被修改，请联系开发商!');
    }
    
    /* 判断已添加的管理员数是否达到最大限制 */
    if(reach_max_admin())
    {
    	sys_msg('您添加的管理员数，已经达到最大限制(' . MAX_ADMINISTRATOR . '人)，请联系开发商!');
    }
    
    /* 模板赋值 */
    $smarty->assign('ur_here',     '添加管理员');
    $smarty->assign('action_link', array('href'=>'privilege.php?act=list', 'text' => '管理员列表'));
    $smarty->assign('form_act',    'insert');
    $smarty->assign('action',      'add');

    /* 显示页面 */
    assign_query_info();
    
    $smarty->display("privilege_info.tpl");    
}

/*------------------------------------------------------ */
//-- 添加管理员的处理
/*------------------------------------------------------ */
elseif ($_REQUEST['act'] == 'insert')
{
    admin_priv('add_admin');

    /* 判断已添加的管理员数是否达到最大限制 */
    if(reach_max_admin())
    {
    	sys_msg('您添加的管理员数，已经达到最大限制，请联系开发商!');
    }
    
    /* 判断管理员是否已经存在 */
    if (!empty($_POST['user_name']))
    {
        $is_only = $exc->is_only('user_name', stripslashes($_POST['user_name']));

        if (!$is_only)
        {
            sys_msg(sprintf('该管理员已经存在!', stripslashes($_POST['user_name'])), 1);
        }
    }

    /* Email地址是否有重复 */
    //if (!empty($_POST['email']))
    // {
        //$is_only = $exc->is_only('email', stripslashes($_POST['email']));

        //if (!$is_only)
        //{
            //sys_msg(sprintf('Email地址已经存在!', stripslashes($_POST['email'])), 1);
        //}
    //}

    /* 获取添加日期及密码 */
    $add_time = gmtime();
    $password  = md5($_POST['password']);

    $sql = "SELECT nav_list FROM " . $os->table('admin_user') . " WHERE action_list = 'all'";
    $row = $db->getRow($sql);

    $sql = "INSERT INTO ".$os->table('admin_user')." (user_name, email, password, add_time, nav_list,user_code) ".
           "VALUES ('".trim($_POST['user_name'])."', '".trim($_POST['user_name'])."', '$password', '$add_time', '$row[nav_list]', '".trim($_POST['user_code'])."')";

    $db->query($sql);
    /* 转入权限分配列表 */
    $new_id = $db->Insert_ID();

    /*添加链接*/
    $link[0]['text'] = '返回管理员列表';
    $link[0]['href'] = 'privilege.php?act=list&uselastfilter=1';

    $link[1]['text'] = '继续添加管理员';
    $link[1]['href'] = 'privilege.php?act=add';

    /* 生成验证登陆的加密文本 */
    generate_encrypt();
    
    sys_msg('添加&nbsp;' .$_POST['user_name'] . '&nbsp;操作成功!',0, $link);

    /* 记录管理员操作 */
    admin_log($_POST['user_name'], 'add', 'privilege');
}

/*------------------------------------------------------ */
//-- 编辑管理员信息
/*------------------------------------------------------ */
elseif ($_REQUEST['act'] == 'edit')
{
    /* 不能编辑demo这个管理员 */
    if ($_SESSION['admin_name'] == 'demo')
    {
       $link[] = array('text' => '返回管理员列表', 'href'=>'privilege.php?act=list');
       sys_msg('您不能对此管理员的权限进行任何操作!', 0, $link);
    }

    $_REQUEST['id'] = !empty($_REQUEST['id']) ? intval($_REQUEST['id']) : 0;

    /* 查看是否有权限编辑其他管理员的信息 */
    if ($_SESSION['admin_id'] != $_REQUEST['id'])
    {
        admin_priv('edit_admin');
    }

    /* 获取管理员信息 */
    $sql = "SELECT user_id, user_name, email, password, agency_id,user_code FROM " .$os->table('admin_user').
           " WHERE user_id = '".$_REQUEST['id']."'";
    $user_info = $db->getRow($sql);

    /* 取得该管理员负责的办事处名称 */
    if ($user_info['agency_id'] > 0)
    {
        $sql = "SELECT agency_name FROM " . $os->table('agency') . " WHERE agency_id = '$user_info[agency_id]'";
        $user_info['agency_name'] = $db->getOne($sql);
    }

    /* 模板赋值 */
    $smarty->assign('ur_here',     '编辑管理员');
    $smarty->assign('action_link', array('text' => '管理员列表', 'href'=>'privilege.php?act=list'));
    $smarty->assign('user',        $user_info); 
    $smarty->assign('form_act',    'update');
    $smarty->assign('action',      'edit');

    assign_query_info();
    
    $smarty->display("privilege_info.tpl");     
}

/*------------------------------------------------------ */
//-- 更新管理员信息
/*------------------------------------------------------ */
elseif ($_REQUEST['act'] == 'update' || $_REQUEST['act'] == 'update_self')
{

    /* 变量初始化 */
    $admin_id    = !empty($_REQUEST['id'])        ? intval($_REQUEST['id'])      : 0;
    $admin_name  = !empty($_REQUEST['user_name']) ? trim($_REQUEST['user_name']) : '';
    $admin_email = !empty($_REQUEST['email'])     ? trim($_REQUEST['email'])     : '';

    $password = !empty($_POST['new_password']) ? ", password = '".md5($_POST['new_password'])."'"    : '';
    if ($_REQUEST['act'] == 'update')
    {
        /* 查看是否有权限编辑其他管理员的信息 */
        if ($_SESSION['admin_id'] != $_REQUEST['id'])
        {
            admin_priv('edit_admin');
        }
        $g_link = 'privilege.php?act=list';
        $nav_list = '';
    }
    else
    {
        $nav_list = !empty($_POST['nav_list'])     ? ", nav_list = '".@join(",", $_POST['nav_list'])."'" : '';
        $admin_id = $_SESSION['admin_id'];
        $g_link = 'privilege.php?act=modif';
    }
    /* 判断管理员是否已经存在 */
    if (!empty($admin_name))
    {
        $is_only = $exc->num('user_name', stripslashes($admin_name), $admin_id);
        if ($is_only == 1)
        {
            sys_msg(sprintf('该管理员已经存在!', stripslashes($admin_name)), 1);
        }
    }

    /* Email地址是否有重复 */
    if (!empty($admin_email))
    {
        $is_only = $exc->num('email', stripslashes($admin_email), $admin_id);

        if ($is_only == 1)
        {
            sys_msg(sprintf('Email地址已经存在!', stripslashes($admin_email)), 1);
        }
    }

    //如果要修改密码
    $pwd_modified = false;

    if (!empty($_POST['new_password']))
    {
        /* 查询旧密码并与输入的旧密码比较是否相同 */
        $sql = "SELECT password FROM ".$os->table('admin_user')." WHERE user_id = '$admin_id'";
        $old_password = $db->getOne($sql);
        if ($old_password <> (md5($_POST['old_password'])))
        {
           $link[] = array('text' => '返回上一页', 'href'=>'javascript:history.back(-1)');
           sys_msg('输入的旧密码错误!', 0, $link);
        }

        /* 比较新密码和确认密码是否相同 */
        if ($_POST['new_password'] <> $_POST['pwd_confirm'])
        {
           $link[] = array('text' => '返回上一页', 'href'=>'javascript:history.back(-1)');
           sys_msg('两次输入的密码不一致!', 0, $link);
        }
        else
        {
            $pwd_modified = true;
        }
    }

    //更新管理员信息
    $sql = "UPDATE " .$os->table('admin_user'). " SET ".
           "user_name = '$admin_name', ".
           "email = '$admin_email'".
           $password.
           $nav_list.
           "WHERE user_id = '$admin_id'";

   $db->query($sql);
   /* 记录管理员操作 */
   admin_log($_POST['user_name'], 'edit', 'privilege');

   /* 如果修改了密码，则需要将session中该管理员的数据清空 */
   if ($pwd_modified && $_REQUEST['act'] == 'update_self')
   {
       $sess->delete_spec_admin_session($_SESSION['admin_id']);
       $msg = '您已经成功的修改了密码，因此您必须重新登录!';
   }
   else
   {
       $msg = '您已经成功的修改了个人帐号信息!';
   }

   /* 提示信息 */
   $link[] = array('text' => strpos($g_link, 'list') ? '返回管理员列表' : '编辑个人资料', 'href'=>$g_link);
   
   /* 生成验证登陆的加密文本 */
   generate_encrypt();
   
   sys_msg("$msg<script>parent.document.getElementById('header-frame').contentWindow.document.location.reload();</script>", 0, $link);
}

/*------------------------------------------------------ */
//-- 编辑个人资料
/*------------------------------------------------------ */
elseif ($_REQUEST['act'] == 'modif')
{
    /* 不能编辑demo这个管理员 */
    if ($_SESSION['admin_name'] == 'demo')
    {
       $link[] = array('text' => '管理员列表', 'href'=>'privilege.php?act=list');
       sys_msg('您不能对此管理员的权限进行任何操作!', 0, $link);
    }

    /* 包含插件菜单语言项 */
    $sql = "SELECT code FROM ".$os->table('plugins');
    $rs = $db->query($sql);
    while ($row = $db->FetchRow($rs))
    {
        /* 取得语言项 */
        if (file_exists(SOURCE_PATH.'plugins/'.$row['code'].'/languages/common_'.$_CFG['lang'].'.php'))
        {
            include_once(SOURCE_PATH.'plugins/'.$row['code'].'/languages/common_'.$_CFG['lang'].'.php');
        }

        /* 插件的菜单项 */
        if (file_exists(SOURCE_PATH.'plugins/'.$row['code'].'/languages/inc_menu.php'))
        {
            include_once(SOURCE_PATH.'plugins/'.$row['code'].'/languages/inc_menu.php');
        }
    }


    /* 获得当前管理员数据信息 */
    $sql = "SELECT user_id, user_name, email, nav_list ".
           "FROM " .$os->table('admin_user'). " WHERE user_id = '".$_SESSION['admin_id']."'";
    $user_info = $db->getRow($sql);

    /* 获取导航条 */
    $nav_arr = (trim($user_info['nav_list']) == '') ? array() : explode(",", $user_info['nav_list']);
    $nav_lst = array();
    foreach ($nav_arr AS $val)
    {
        $arr              = explode('|', $val);
        $nav_lst[$arr[1]] = $arr[0];
    }

    /* 模板赋值 */
    $smarty->assign('lang',        $_LANG);
    $smarty->assign('ur_here',     '编辑个人资料');
    $smarty->assign('action_link', array('text' => '管理员列表', 'href'=>'privilege.php?act=list'));
    $smarty->assign('user',        $user_info);
    $smarty->assign('nav_arr',     $nav_lst);
    $smarty->assign('form_act',    'update_self');
    $smarty->assign('action',      'modif');

    /* 显示页面 */
    assign_query_info();
    $smarty->display("privilege_info.tpl");     
}
/*------------------------------------------------------ */
//-- 删除一个管理员
/*------------------------------------------------------ */
elseif ($_REQUEST['act'] == 'remove')
{
    check_authz_json('drop_admin');

    $id = intval($_GET['id']);

    /* 获得管理员用户名 */
    $admin_name = $db->getOne('SELECT user_name FROM '.$os->table('admin_user')." WHERE user_id='$id'");

    /* demo这个管理员不允许删除 */
    if ($admin_name == 'demo')
    {
        make_json_error('您不能删除demo这个管理员!');
    }

    /* ID为1的不允许删除 */
    if ($id == 1)
    {
        make_json_error('此管理员您不能进行删除操作!');
    }

    /* 管理员不能删除自己 */
    if ($id == $_SESSION['admin_id'])
    {
        make_json_error('您不能删除自己!');
    }

    if ($exc->drop($id))
    {
        $sess->delete_spec_admin_session($id); // 删除session中该管理员的记录

        admin_log(addslashes($admin_name), 'remove', 'privilege');
        clear_cache_files();
    }

    $url = 'privilege.php?act=query&' . str_replace('act=remove', '', $_SERVER['QUERY_STRING']);

    /* 生成验证登陆的加密文本 */
    generate_encrypt();
    
    os_header("Location: $url\n");
    exit;
}

/* 获取管理员列表 */
function get_admin_userlist()
{
    $list = array();
    $sql  = 'SELECT user_id, user_name, email, add_time, last_login '.
            'FROM ' .$GLOBALS['os']->table('admin_user').' ORDER BY user_id DESC';
    $list = $GLOBALS['db']->getAll($sql);

    foreach ($list AS $key=>$val)
    {
        $list[$key]['add_time']     = local_date($GLOBALS['_CFG']['time_format'], $val['add_time']);
        $list[$key]['last_login']   = local_date($GLOBALS['_CFG']['time_format'], $val['last_login']);
    }

    return $list;
}

/* 清除购物车中过期的数据 */
function clear_cart()
{
    /* 取得有效的session */
    $sql = "SELECT DISTINCT session_id " .
            "FROM " . $GLOBALS['os']->table('cart') . " AS c, " .
                $GLOBALS['os']->table('sessions') . " AS s " .
            "WHERE c.session_id = s.sesskey ";
    $valid_sess = $GLOBALS['db']->getCol($sql);

    // 删除cart中无效的数据
    $sql = "DELETE FROM " . $GLOBALS['os']->table('cart') .
            " WHERE session_id NOT " . db_create_in($valid_sess);
    $GLOBALS['db']->query($sql);
}

?>
